#include"../../include/drawer/draw.hpp"
#include <DirectXMath.h>
using namespace DirectX;
using namespace std;
namespace SoftEngine{
    // 使用这个可以画出投影到平面上的所有点。
    void Drawer::drawDotPlane(vector<XMFLOAT2> alldot,HDC hdc){
        for (auto dot : alldot){
            SetPixel(hdc,dot.x,dot.y, RGB(255, 0, 0));
        }
    }
    void Drawer::drawMesh(vector<XMFLOAT2> alldot, vector<Mesh> allMesh, HDC hdc) {
        for (auto mesh : allMesh) {
            MoveToEx(hdc, alldot[mesh.index1].x, alldot[mesh.index1].y, NULL);
            LineTo(hdc, alldot[mesh.index2].x, alldot[mesh.index2].y);
            LineTo(hdc, alldot[mesh.index3].x, alldot[mesh.index3].y);
            LineTo(hdc, alldot[mesh.index1].x, alldot[mesh.index1].y);
        }
    }
    void Drawer::drawMeshColorful(vector<XMFLOAT2> alldot,vector<MeshColorful> allMesh,HDC hdc){
        for (auto mesh : allMesh) {
            // 创建并选择画刷(设置填充颜色)
            HBRUSH hBrush = CreateSolidBrush(mesh.color); // mesh.color是COLORREF类型
            HBRUSH oldBrush = (HBRUSH)SelectObject(hdc, hBrush);
            
            // 创建三角形顶点数组
            POINT points[3] = {
                {(LONG)alldot[mesh.index1].x, (LONG)alldot[mesh.index1].y},
                {(LONG)alldot[mesh.index2].x, (LONG)alldot[mesh.index2].y},
                {(LONG)alldot[mesh.index3].x, (LONG)alldot[mesh.index3].y}
            };
            
            // 填充三角形
            Polygon(hdc, points, 3);
            
            // 清理资源
            SelectObject(hdc, oldBrush);
            DeleteObject(hBrush);
        }
        // 经过这里的测试，这里的1，还真的就是一个像素，我怀疑是因为windows自动做了抗锯齿，所以显得一个像素很小，但是实际上很大
        // 另外这个测试也很好的反映出了，GDI的速度很慢，一秒大概只能执行3000个左右的指令。
        // for(auto line=0;line<=1000;line++){
        //     for(auto dot=0;dot<=1000;dot++){
        //     SetPixel(hdc,line,dot, RGB(255, 0, 0));
        //     }
        // }
    }
    void Drawer::drawPlaneColorful(vector<vector<DotColorful>> plane,HDC hdc){
        for (auto& line : plane) {
            for (auto& dot : line) {
                SetPixel(hdc, dot.position.x, dot.position.y, dot.color);
            }
        }
    }
}